package com.electronic.modules.other;

import com.electronic.api.R;
import com.electronic.exception.ResultCode;
import com.electronic.exception.ServiceException;
import com.electronic.modules.other.param.CopyDirDTO;
import com.electronic.modules.other.param.CreateDirDTO;
import com.electronic.modules.verify.param.CheckAdminPermissionDTO;
import com.electronic.modules.verify.param.DownloadFileDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * @author zyh 
 * ================================
 * Date: 2024/8/2
 * Time: 下午3:31
 * ================================
 */
public class DirService {
    private static final Logger log = LoggerFactory.getLogger(DirService.class);

    public static R<String> createDir(CreateDirDTO createdDirDTO) {
        // 创建一个File对象

        // 创建 File 对象
        File directory = new File(createdDirDTO.getPath());

        // 如果目录不存在，则创建它
        if (!directory.exists()) {
            boolean created = directory.mkdirs(); // 注意这里使用 mkdirs() 可以创建多级目录
            if (created) {
                log.info("目录创建成功: " + createdDirDTO.getPath());
                return R.data("目录创建成功"+createdDirDTO.getPath());
            } else {
                log.error("目录创建失败: " + createdDirDTO.getPath());
                throw new ServiceException(ResultCode.ERROR_FILE_FORBIDDEN,ResultCode.ERROR_FILE_FORBIDDEN.getMessage());
            }
        } else {
            log.info("目录已存在: " + createdDirDTO.getPath());
            return  R.data("目录已存在"+createdDirDTO.getPath());
        }


    }


    /**
     * 复制文件夹
     * @param copyDir 文件路径参数
     * @return 文件路径
     * @throws IOException
     */
    public static R<String> copyDir(CopyDirDTO copyDir) {
        //获取源文件路径
        Path sourcePath = Paths.get(copyDir.getPath());

        // 构建目标文件路径
        Path targetPath = Paths.get(copyDir.getTargetPath(), copyDir.getFileName());

        // 检查目标目录是否存在，如果不存在则创建
        try {
            Files.createDirectories(targetPath.getParent());
        } catch (IOException e) {
            throw new ServiceException(ResultCode.ERROR_FILE_FORBIDDEN,ResultCode.ERROR_FILE_FORBIDDEN.getMessage());

        }
        // 使用 Files.copy 方法复制文件
        try {
            if (Files.exists(targetPath)) {
                // 如果目标文件已经存在，则删除它
               Files.delete(targetPath);
            }
            Files.copy(sourcePath, targetPath);
        } catch (IOException e) {
            throw new ServiceException(ResultCode.ERROR_FILE_FORBIDDEN,ResultCode.ERROR_FILE_FORBIDDEN.getMessage());
        }
        return R.data("保存成功");
    }
    /**
     * 从网络 URL 下载文件到本地。
     *
     * @param downloadFileDTO      文件的 URL 地址。
     */
    public  static R<String> downloadFile(DownloadFileDTO downloadFileDTO)  {
        URL url = null;
        try {
            // 创建 URL 对象 传入文件的 URL 地址
            url = new URL(downloadFileDTO.getNetworkPath());
        } catch (MalformedURLException e) {
            // 如果 URL 不合法，则抛出异常

            throw new ServiceException(ResultCode.ERROR_FILE_FORBIDDEN,ResultCode.ERROR_FILE_FORBIDDEN.getMessage());

        }
        // 使用 try-with-resources 语句，自动关闭输入流和输出流
        try (InputStream in = url.openStream()) {
            // 使用 try-with-resources 语句，自动关闭输出流
            //下载到本地路径
            try (FileOutputStream out = new FileOutputStream(downloadFileDTO.getPath())) {
                // 从输入流读取数据，并写入输出流
                byte[] buffer = new byte[4096];
                int bytesRead;
                // 循环读取数据
                while ((bytesRead = in.read(buffer)) != -1) {
                    // 写入输出流
                    out.write(buffer, 0, bytesRead);
                }
            }
        } catch (IOException e) {
            throw new ServiceException(ResultCode.ERROR_FILE_FORBIDDEN,ResultCode.ERROR_FILE_FORBIDDEN.getMessage());
        }
        return R.data("下载成功");
    }

    /**
     * 查看文件权限
     *
     * @param checkAdminPermissionDTO      文件的 URL 地址。
     */
    public  static R<String> CheckAdminPermission(CheckAdminPermissionDTO checkAdminPermissionDTO)  {
        try {
            //创建临时文件夹
            File file = new File(checkAdminPermissionDTO.getPath()+"\\新建文件夹");
            //创建临时文件夹
            file.mkdirs();
            //删除临时文件夹
            file.delete();
            return R.data("无需管理员权限即可写入文件夹:");
        } catch (Exception e) {
            // 如果发生异常，则可能是需要管理员权限
            throw new ServiceException(ResultCode.ERROR_FILE_FORBIDDEN,ResultCode.ERROR_FILE_FORBIDDEN.getMessage());
        }
    }



}